# test quicksort

$2=="r"    { for(i = 1; i <= $1; i++)
		A[i] = rand()
	last = $1; exit }
$2=="e"	{ for(i = 1; i <= $1; i++)
		A[i] = 1
	last = $1; exit}
END { qsort(A, 1, last)
	print ncmp, nexch
    }

function qsort(A,left,right,   i,last, rtlast) {
     if (left >= right)  # do nothing if array contains
         return          # less than two elements
     swap(A, left, left + int((right-left+1)*rand())); nexch--
     last = left
     for (i = left+1; i <= right; i++)
         if (++ncmp && A[i] < A[left])
             swap(A, ++last, i)
     swap(A, left, last); nexch--
     for(rtlast = last; ++ncmp && A[rtlast] == A[last]; rtlast++)
		;
     qsort(A, left, last-1)
     qsort(A, rtlast, right)
}

function swap(A,i,j,   t) { nexch++
     t = A[i]; A[i] = A[j]; A[j] = t
}
